/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tesis.service.impl;


import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tesis.common.utils.CollectionsUtil;
import tesis.common.utils.ConvertBeanUtil;
import tesis.domain.TipoDato;
import tesis.dto.in.TipoDatoDTO;

import tesis.service.CrudService;
import tesis.service.TipoDatoService;

/**
 *
 * @author hugo
 */

@Transactional
@Service("tipoDatoService")
public class TipoDatoServiceImpl implements TipoDatoService {

     private final static Logger LOG=LoggerFactory.getLogger(TipoDatoServiceImpl.class);
    
    
    
    @Inject
    private CrudService crud;
    
    
      @Override
    public List<TipoDatoDTO> find(TipoDatoDTO filtro) {
        List<TipoDatoDTO> lstTipoDatos=new ArrayList<TipoDatoDTO>();
        List<TipoDato>results=null;
        Query query=null;
        try{
            LOG.info("buscando tipo de datos");
            query=construirFindQuery(filtro,false);
            results=query.getResultList();
            if (!CollectionsUtil.isEmpty(results)){
                for(TipoDato t:results){
                    lstTipoDatos.add(ConvertBeanUtil.toTipoDatoDTO(t));
                }
            }
            LOG.info("lista obtenida con éxito, tam: "+lstTipoDatos.size());
        }catch(RuntimeException ex){
            LOG.error("Error al obtener usuarios",ex);
            throw ex;
        }
        return lstTipoDatos;
         
    }
    
    private Query construirFindQuery(TipoDatoDTO filtro, boolean contar){
        Query query=null;
        StringBuilder sb=new StringBuilder();
        try{
            if (!contar){
                sb.append("SELECT c ");
            }else{
                sb.append("SELECT count(c) ");
            }
            sb.append(" FROM TipoDato c where 1 = 1 ");
            if(!contar){
                sb.append(" ORDER BY c.nombretipodato asc ");
            }
            query=crud.getEm().createQuery(sb.toString());
        }catch(RuntimeException ex){
             LOG.error("Error contar rol",ex);
            throw ex;
        }
        return query;
    }
    
    @Override
    public TipoDatoDTO findByName(String nombre){
        List<TipoDatoDTO> lstTipoDatos=new ArrayList<TipoDatoDTO>();
        List<TipoDato>results=null;
        Query query=null;
        StringBuilder sb=new StringBuilder();
        try{
            sb.append("SELECT c FROM TipoDato c WHERE c.nombretipodato = :nombretipodato");
            LOG.info("buscando tipo de datos");
            query=crud.getEm().createQuery(sb.toString());
            query.setParameter("nombretipodato", ""+nombre+"");
            results=query.getResultList();
            if (!CollectionsUtil.isEmpty(results)){
                for(TipoDato t:results){
                    lstTipoDatos.add(ConvertBeanUtil.toTipoDatoDTO(t));
                }
            }
            LOG.info("lista obtenida con éxito, tam: "+lstTipoDatos.size());
        }catch(RuntimeException ex){
            LOG.error("Error al obtener usuarios",ex);
            throw ex;
        }
        return lstTipoDatos.get(0);
    }
    
}
